1.03. Тест на готовность к работе с данными
Тест на готовность к работе с данными
1: Данные и информация
Часть A: Вопросы
- Что такое данные в контексте информационных систем?
- Чем информация отличается от данных?
- Приведи пример неструктурированных данных.
- Какие характеристики делают данные пригодными для анализа?
- Что означает термин «качество данных»?
- Почему важно учитывать происхождение данных (data provenance)?
- Как данные становятся знанием?
- Что такое метаданные и зачем они нужны?
- Какие источники данных считаются первичными, а какие — вторичными?
- В чём ценность временной метки (timestamp) в наборе данных?
Часть B: Практические задачи
Задача 1.
У тебя есть файл logs.txt, содержащий строки вида:
2026-01-14T08:23:11Z | user_4582 | login_success
2026-01-14T08:25:03Z | user_4582 | page_view:/dashboard
2026-01-14T08:26:47Z | user_9103 | login_failed
Выдели из этого файла только события успешного входа (login_success) и выпиши соответствующие временные метки.
Задача 2.
Дан текстовый фрагмент:
«Погода сегодня ясная. Температура +5°C. Вчера было +3°C. Завтра ожидается дождь.»
Преобразуй этот текст в структурированный формат, содержащий поля: дата, погода, температура. Используй только информацию, явно указанную в тексте.
Задача 3.
Ты получил CSV-файл с колонками: id, name, email, registration_date.
Однако в колонке email встречаются значения вроде "N/A", "-", пустые строки и корректные адреса.
Опиши шаги по очистке этой колонки так, чтобы остались только валидные email-адреса.
Ответы
Часть A: Ответы на вопросы
- Данные — это факты, наблюдения или измерения, представленные в форме, пригодной для хранения, передачи и обработки.
- Информация — это данные, наделённые смыслом и контекстом, которые позволяют принимать решения или делать выводы.
- Пример неструктурированных данных: текст статьи, аудиозапись интервью, изображение с камеры наблюдения.
- Пригодность данных для анализа определяется их полнотой, точностью, согласованностью, своевременностью и релевантностью.
- Качество данных — это степень, в которой данные соответствуют требованиям конкретного использования: отсутствие ошибок, дубликатов, пропусков и противоречий.
- Происхождение данных помогает установить их достоверность, отследить изменения и обеспечить соответствие нормативным требованиям.
- Данные становятся знанием после интерпретации, анализа и интеграции в существующую модель понимания мира.
- Метаданные — это данные о данных: формат, источник, дата создания, автор, единицы измерения. Они упрощают поиск, управление и понимание основных данных.
- Первичные источники — это оригинальные данные, собранные напрямую (опросы, сенсоры, логи). Вторичные — данные, переработанные или агрегированные из первичных (отчёты, аналитические сводки).
- Временная метка указывает момент фиксации события, что критично для анализа последовательности, трендов и причинно-следственных связей.
Часть B: Решения задач
Задача 1.
Фильтрация строк с login_success:
2026-01-14T08:23:11Z
(Только одна строка содержит login_success.)
Задача 2.
Структурированный результат (в виде таблицы или списка словарей):
[
{ "дата": "сегодня", "погода": "ясная", "температура": "+5°C" },
{ "дата": "вчера", "погода": "не указана", "температура": "+3°C" }
]
(«Завтра» не включено, так как погода указана как «ожидается», а температура не дана.)
Задача 3.
Шаги очистки:
- Удалить строки, где значение
emailравно"N/A","-"или пустой строке. - Проверить оставшиеся значения на соответствие базовому шаблону email (наличие символа
@, домена после точки). - Сохранить только те строки, где email прошёл проверку.
(Дополнительно: можно нормализовать регистр — привести к нижнему.)
2: Структуры данных
Часть A: Вопросы
- Что такое структура данных?
- Какой тип структуры данных обеспечивает доступ к элементам по индексу за константное время?
- В чём преимущество связного списка перед массивом при частых вставках и удалениях?
- Что такое хеш-таблица и как она обеспечивает быстрый поиск?
- Как устроено двоичное дерево поиска?
- Чем стек отличается от очереди по принципу обработки элементов?
- Когда целесообразно использовать граф для представления данных?
- Что означает термин «плоская структура данных»?
- Какие структуры данных подходят для хранения иерархической информации?
- Почему выбор структуры данных влияет на производительность программы?
Часть B: Практические задачи
Задача 1.
У тебя есть список пользователей:
[
{ "id": 101, "name": "Алиса" },
{ "id": 102, "name": "Борис" },
{ "id": 103, "name": "Вера" }
]
Предложи структуру данных, позволяющую мгновенно находить пользователя по id. Обоснуй выбор.
Задача 2.
Ты реализуешь функцию «Отменить действие» в текстовом редакторе. Какую структуру данных ты выберешь для хранения истории изменений? Опиши логику добавления и извлечения шагов.
Задача 3.
Даны связи между городами:
- Москва → Санкт-Петербург
- Москва → Казань
- Санкт-Петербург → Хельсинки
- Казань → Екатеринбург
Представь эти данные в виде структуры, подходящей для алгоритма поиска маршрута. Укажи тип структуры и её содержимое.
Ответы
Часть A: Ответы на вопросы
- Структура данных — это способ организации, хранения и управления данными, обеспечивающий эффективный доступ и модификацию.
- Массив (или динамический массив, например,
Listв C# илиlistв Python) обеспечивает доступ по индексу за O(1). - Связный список позволяет вставлять и удалять элементы без перемещения остальных данных, так как операции затрагивают только ссылки между узлами.
- Хеш-таблица сопоставляет ключи значениям через хеш-функцию, которая вычисляет индекс в массиве. При хорошем распределении это даёт среднее время поиска O(1).
- В двоичном дереве поиска для каждого узла все элементы в левом поддереве меньше его значения, а в правом — больше или равны. Это упорядоченная иерархическая структура.
- Стек работает по принципу LIFO (последним пришёл — первым вышел), очередь — по FIFO (первым пришёл — первым вышел).
- Граф уместен, когда данные представляют отношения или связи между сущностями: социальные сети, транспортные маршруты, зависимости задач.
- Плоская структура данных — это коллекция записей без вложенности, где каждый элемент содержит только скалярные значения (например, таблица с колонками, но без объектов внутри ячеек).
- Для иерархической информации подходят деревья, вложенные словари, XML/JSON с рекурсивной структурой или родительско-потомственные таблицы в базах данных.
- Разные структуры данных имеют разную сложность операций (поиск, вставка, обход). Неправильный выбор может привести к замедлению работы, избыточному потреблению памяти или усложнению кода.
Часть B: Решения задач
Задача 1.
Использовать хеш-таблицу (словарь), где ключ — id, значение — объект пользователя:
{
"101": { "id": 101, "name": "Алиса" },
"102": { "id": 102, "name": "Борис" },
"103": { "id": 103, "name": "Вера" }
}
Обоснование: поиск по ключу в хеш-таблице выполняется за среднее константное время, что оптимально для частых запросов по id.
Задача 2.
Выбираем стек.
- При каждом изменении (ввод текста, удаление) состояние документа (или действие) помещается в стек с помощью операции
push. - При нажатии «Отменить» вызывается
pop, извлекая последнее действие и применяя обратную операцию.
Это точно соответствует LIFO-логике отмены.
Задача 3.
Используем ориентированный граф, представленный в виде списка смежности:
{
"Москва": ["Санкт-Петербург", "Казань"],
"Санкт-Петербург": ["Хельсинки"],
"Казань": ["Екатеринбург"],
"Хельсинки": [],
"Екатеринбург": []
}
Такая структура позволяет эффективно перебирать соседей при поиске в ширину (BFS) или глубину (DFS).
3: Операции с данными
Часть A: Вопросы
- Что означает термин «трансформация данных»?
- Какие операции входят в этап очистки данных?
- Что такое агрегация данных и где она применяется?
- Зачем выполняется нормализация числовых данных?
- Как происходит объединение (join) двух наборов данных по ключу?
- Что такое фильтрация данных и как она влияет на объём анализа?
- В чём разница между сортировкой и группировкой данных?
- Какие операции позволяют обогатить данные внешней информацией?
- Что означает «разворачивание» (unpivot) табличных данных?
- Почему важно сохранять историю операций над данными?
Часть B: Практические задачи
Задача 1.
Даны два списка:
users = [{"id": 1, "name": "Алиса"}, {"id": 2, "name": "Борис"}]orders = [{"user_id": 1, "product": "Книга"}, {"user_id": 1, "product": "Блокнот"}]
Выполни операцию объединения, чтобы получить список всех заказов с именами пользователей. Представь результат в виде нового списка словарей.
Задача 2.
Таблица содержит колонки: дата, регион, продажи.
Пример:
2026-01-10 | Москва | 15000
2026-01-10 | СПб | 12000
2026-01-11 | Москва | 18000
Сгруппируй данные по региону и вычисли общую сумму продаж для каждого.
Задача 3.
Исходная таблица в «широком» формате:
месяц | доход_янв | доход_фев | доход_мар
Проект A | 10000 | 12000 | 11000
Преобразуй её в «длинный» формат с колонками: проект, месяц, доход.
Ответы
Часть A: Ответы на вопросы
- Трансформация данных — это процесс изменения формы, структуры или представления данных без потери смысла, например, приведение к единому формату или перекодировка.
- Этап очистки включает удаление дубликатов, исправление опечаток, заполнение пропусков, приведение типов, фильтрацию аномалий и унификацию значений.
- Агрегация — это свёртка множества значений в одно (сумма, среднее, максимум и т.п.). Применяется в отчётности, аналитике и дашбордах.
- Нормализация приводит числовые значения к сопоставимому диапазону (например, от 0 до 1), что улучшает работу алгоритмов машинного обучения и визуализацию.
- Объединение по ключу сопоставляет записи из двух наборов, имеющих совпадающее значение в указанной колонке (например,
user_id), и создаёт комбинированную запись. - Фильтрация — это отбор подмножества данных по условию (например, только за январь). Она снижает объём обрабатываемых данных и фокусирует анализ.
- Сортировка упорядочивает строки по значению колонки (по возрастанию/убыванию). Группировка объединяет строки с одинаковым значением в категории для последующей агрегации.
- Обогащение данных достигается через объединение с внешними источниками (справочниками, API, базами знаний), добавляя новые атрибуты (например, географические координаты по адресу).
- Разворачивание (unpivot) преобразует колонки в строки: вместо отдельных полей под каждый период создаётся одна колонка с названием периода и одна — со значением.
- История операций (data lineage) позволяет воспроизвести результат, проверить корректность, отладить ошибки и обеспечить соответствие требованиям аудита.
Часть B: Решения задач
Задача 1.
Результат объединения (left join по id = user_id):
[
{ "user_id": 1, "product": "Книга", "name": "Алиса" },
{ "user_id": 1, "product": "Блокнот", "name": "Алиса" }
]
(Заказы Бориса отсутствуют, поэтому он не попадает в результат при inner join; если нужен left join от users — он тоже не добавится, так как у него нет заказов.)
Задача 2.
Сгруппированный результат:
Москва | 33000
СПб | 12000
(15000 + 18000 = 33000 для Москвы)
Задача 3.
«Длинный» формат:
проект | месяц | доход
Проект A | янв | 10000
Проект A | фев | 12000
Проект A | мар | 11000
(Каждая колонка с доходом превращается в строку с указанием месяца)
4: SQL и NoSQL
Часть A: Вопросы
- Что такое реляционная база данных и как она организует данные?
- Какие основные операции поддерживает язык SQL?
- Что означает термин «схема» в контексте реляционных баз данных?
- В чём преимущество использования первичного ключа?
- Как работает оператор
JOINв SQL и какие его типы существуют? - Что такое документ в NoSQL-базах и как он отличается от строки в SQL?
- Почему NoSQL-системы часто выбирают для высоконагруженных приложений?
- Какие типы NoSQL-баз данных существуют и чем они различаются?
- Что означает «горизонтальное масштабирование» и почему оно характерно для NoSQL?
- Когда предпочтительнее использовать SQL, а когда — NoSQL?
Часть B: Практические задачи
Задача 1.
Дана таблица employees:
| id | name | department_id | salary |
|---|---|---|---|
| 1 | Алиса | 10 | 90000 |
| 2 | Борис | 20 | 85000 |
| 3 | Вера | 10 | 95000 |
Напиши SQL-запрос, который вернёт имя сотрудника с максимальной зарплатой в каждом отделе.
Задача 2.
У тебя есть данные о пользователях и их заказах в формате JSON:
{
"user_id": "u101",
"name": "Алиса",
"orders": [
{ "order_id": "o201", "amount": 1500 },
{ "order_id": "o202", "amount": 2300 }
]
}
Какую NoSQL-модель ты выберешь для хранения таких данных? Обоснуй и опиши структуру документа.
Задача 3.
Ты проектируешь систему аналитики посещений сайта. Каждое событие содержит:
user_idtimestamppage_urldevice_type
Объём данных — миллионы событий в день. Частые запросы: «Сколько уникальных пользователей за день?», «Какие страницы самые популярные?».
Выбери тип базы данных (SQL или NoSQL) и обоснуй выбор с учётом нагрузки, структуры и типов запросов.
Ответы
Часть A: Ответы на вопросы
- Реляционная база данных хранит данные в виде таблиц, где строки — записи, а столбцы — атрибуты. Связи между таблицами устанавливаются через внешние ключи.
- SQL поддерживает операции:
SELECT(чтение),INSERT(вставка),UPDATE(обновление),DELETE(удаление), а также управление схемой (CREATE,ALTER) и транзакциями (BEGIN,COMMIT). - Схема — это строгая структура базы данных: определение таблиц, колонок, типов данных, ограничений (например,
NOT NULL,UNIQUE) и связей. - Первичный ключ однозначно идентифицирует каждую запись в таблице, обеспечивает целостность и ускоряет поиск.
JOINобъединяет строки из двух или более таблиц на основе совпадения значений в связанных колонках. Типы:INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL OUTER JOIN.- Документ в NoSQL — это самодостаточная структура (обычно в формате JSON/BSON), содержащая вложенные поля и массивы. В отличие от строки SQL, он не обязан соответствовать фиксированной схеме.
- NoSQL-системы обеспечивают высокую производительность за счёт отказа от строгой согласованности, гибкой схемы и эффективного горизонтального масштабирования.
- Типы NoSQL:
- Документные (MongoDB) — хранят JSON-подобные документы.
- Ключ-значение (Redis, DynamoDB) — простые пары.
- Колоночные (Cassandra) — оптимизированы для аналитики.
- Графовые (Neo4j) — моделируют связи.
- Горизонтальное масштабирование — добавление новых серверов вместо усиления одного. NoSQL-системы проектируются так, чтобы распределять данные по узлам без единой точки отказа.
- SQL предпочтителен при необходимости сложных запросов, транзакций и строгой целостности (финансы, учёт). NoSQL — при высокой нагрузке, изменчивой структуре, быстрой разработке и распределённой архитектуре (соцсети, IoT, логи).
Часть B: Решения задач
Задача 1.
SQL-запрос с оконной функцией:
SELECT name, department_id, salary
FROM (
SELECT name, department_id, salary,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rn
FROM employees
) ranked
WHERE rn = 1;
Задача 2.
Выбираем документную NoSQL-базу (например, MongoDB).
Структура документа совпадает с исходным JSON:
{
"_id": "u101",
"name": "Алиса",
"orders": [
{ "order_id": "o201", "amount": 1500 },
{ "order_id": "o202", "amount": 2300 }
]
}
Обоснование: данные иерархичны, принадлежат одному пользователю, редко изменяются целиком, и запросы обычно идут по user_id.
Задача 3.
Выбираем колоночную NoSQL-базу (например, Apache Cassandra или Amazon Keyspaces) или временную базу данных (TimescaleDB поверх PostgreSQL, если допустим SQL).
Обоснование:
- Высокая скорость записи миллионов событий.
- Запросы агрегируют данные по времени и URL — колоночное хранение эффективно для таких операций.
- Схема проста и стабильна, но объём требует горизонтального масштабирования.
Если важна гибкость аналитики и совместимость с BI-инструментами, можно выбрать SQL с оптимизацией под время (TimescaleDB). Если важна масштабируемость и простота — NoSQL (Cassandra/DynamoDB).